<?php
namespace Pinenut\Cache\Adapter;

use Pinenut\Cache\Adapter;
use Pinenut\Di\Injectable;

/**
 * Адаптер кеширующий локально в памяти пхп в пределах одного запроса, и являющийся прокси к другому адаптеру
 * 
 *
 * @author kosh
 *
 */
class WriteThroughProxy extends Adapter {

	use Injectable;
	
	/**
	 * @var Pinenut\Cache\Adapter
	 */
	protected static $_baseAdapterClass;
	protected $baseAdapter;
	
	/**
	 * Храним тут найденные или записаные данные
	 */
	protected $cache = [];
	
	function __construct($collection) {
		$this->collection = $collection;
		$this->baseAdapter = new static::$_baseAdapterClass($collection);
	}
	
	public function get($keys) {
		$keys = (array) $keys;
//		\Log::warn('cache-get', count($this->cache));

//		return $this->baseAdapter->get($keys);
		
		$notFoundKeys = [];
		$foundData = [];
		// проверяем наличие каждого ключа у нас локально, выкидываем его из списка
		foreach ($keys as $key) {
			if (array_key_exists($key, $this->cache)) {
				$foundData[$key] = $this->cache[$key];
			} else {
				$notFoundKeys[] = $key;
			}
		}
		
		$receivedData = $this->baseAdapter->get($notFoundKeys);

		// добавляем новые данные
		foreach ($receivedData as $key => $value) {
			$this->cache[$key] = $value;
			$foundData[$key] = $value;
		}

		return (array)$foundData;
	}
	
	public function set($keys, $data = null, $expired = null) {
		
		// готовим массив
		if (is_array($keys)) {
			$items = $keys;
		} else {
			$items = [
				$keys => $data
			];
		}
		// сохраняем его у нас
		foreach ($items as $key => $value) {
			$this->cache[$key] = $value;
		}
		
		return $this->baseAdapter->set($keys, $data, $expired);
	}
	
	public function delete($keys) {
		$keys = (array) $keys;
		foreach ($keys as $key) {
			unset($this->cache[$key]);
		}
		return $this->baseAdapter->delete($keys);
	}
	
}